from DBA.dbmanager import DBInterface

class ListWifi:
    """
    Classe d'acces a la liste des cellules Wifi presents lors de la mesure
    Table: PR5QTLW
    """
    def __init__(self):
        """
        Constructeur. Genere un nouvel ID de listWifi
        """
        self.id            = {"key":"ID","value":""}
        self.ensCelluleWifi    = []
        self.__interfacebase    = DBInterface()
        self.id["value"]    = str(self.__interfacebase.createNewID());
    
    def createByListeDico(self,liste):
        """
        Creation d'un dictionnaire de cellules Wifi
        @param liste liste des cellules Wifi
        """
        for cellule in liste:
            ce = CelluleWifi()
            ce.createByDico(cellule)
            self.addCellule(ce)

    def addCellule(self,Cellule):
        """
        Ajout d'une cellule a la liste en cours
        @param Cellule Objet de type Cellule()
        """
        self.ensCelluleWifi.append(Cellule)
    
    def nbCellules(self):
        """
        Retourne le nombre de cellules pour cette liste.
        """
        return self.ensCelluleWifi.count()
    
    def insertToDb(self,idMesure):
        """
        Insertion dans la BDD de la liste en cours.
        @param idMesure identificateur unique de mesure
        """
        inter   = self.createConfigListDico(idMesure)
        self.__interfacebase.insert(self.__interfacebase.iwlisttablename,self.__interfacebase.iwlistmapping,inter)
        for cellule in self.ensCelluleWifi:
            cellule.insertToDb(self.id["value"])

    def deleteFromDb(self,idMesure):
        """
        Suppression de la BDD de la liste associe a idMesure
        @param idMesure identificateur unique de mesure
        """
        key={}
        key['link_me']=idMesure
        #Je recupere l'ID de la cellule Wifi
        self.selectListWifiFromDB(idMesure)
        #Au cas ou il n'y ai pas de cellule
        elementsuppr=0
        if (self.ensListWifi):
            #Je supprime la cellule
            ce = CelluleWifi()
            elementsuppr=elementsuppr+int(ce.deleteFromDb(self.ensListWifi[0]['ID']))
            #et je supprime l'association
            key['ID']=self.ensListWifi[0]['ID']
            elementsuppr=elementsuppr + int((self.__interfacebase.deleteFromTable(self.__interfacebase.iwlisttablename,self.__interfacebase.iwlistmapping,key)))
        return elementsuppr

    def updateIntoDb(self,idMesure):
        """
        Mise a jour de la liste dans la BDD
        @param idMesure Identificateur unique de la mesure
        """
        inter   = self.createConfigListDico(idMesure)
        self.__interfacebase.update(self.__interfacebase.iwlisttablename,self.__interfacebase.iwlistmapping,inter)
        for cellule in self.ensCelluleWifi:
            cellule.updateIntoDb(self.id["value"])
    
    def createConfigListDico(self,idMesure):
        """
        Creation d'un dictionnaire 'vide' de Liste Wifi (seul l'identificateur de l'objet en cours et de Mesure sont remplis)
        @param idMesure indentificateur unique de mesure
        """
        dico ={}
        dico[self.id["key"]]        = self.id["value"]
        dico["link_me"]            = idMesure
        return dico

    def selectListWifiFromDB(self,identificateur):
        """
        Selectionne la premiere cellule dans la liste wifi courante.
        @param  identificateur identificateur unique de mesure
        """
        ce= CelluleWifi()
        liste_retour=[]
        key ={}
        key["link_me"] = identificateur
        self.ensListWifi = self.__interfacebase.selectTable(self.__interfacebase.iwlisttablename,self.__interfacebase.iwlistmapping,key)
        if (self.ensListWifi):
            return ce.selectCelluleWifiFromDB(self.ensListWifi[0]['ID'])
        else:
            return []
        

class CelluleWifi:
    """
    Classe d'acces aux cellules wifi.
    Ces cellules sont un sous ensemble de listWifi().
    Ce sont elles qui contiennent l'information des cellules voisines lors de la mesure (si environnement radio perturbe a ete selectionne)
    Table: PR5QTCE
    """
    def __init__(self):
        """
        Constructeur
        """
        self.id            = {"key":"ID","value":""}
        self.extra        = {"key":"Extra","value":""}
        self.bitRate        = {"key":"Bit Rates","value":""}
        self.encrytionKey    = {"key":"Encryption key","value":""}
        self.mode        = {"key":"Mode","value":""}
        self.address        = {"key":"Address","value":""}
        self.quality        = {"key":"Quality","value":""}
        self.channel        = {"key":"Channel","value":""}
        self.essid        = {"key":"ESSID","value":""}
        self.__interfacebase    = DBInterface()
    
    def createByDico(self,dico):
        """
        Creation d'une cellule wifi depuis un dictionnaire genere en Page7.
        @param dico Dictionnaire contenant les informations d'une cellule wifi
        """
        self.essid["value"]        = dico[self.essid["key"]]
        self.mode["value"]        = dico[self.mode["key"]] 
        self.extra["value"]        = dico[self.extra["key"]]
        self.encrytionKey["value"]    = dico[self.encrytionKey["key"]]
        self.address["value"]        = dico[self.address["key"]]
        self.bitRate["value"]        = dico[self.bitRate["key"]]
        self.quality["value"]        = dico[self.quality["key"]]
        self.channel["value"]        = dico[self.channel["key"]]
         
    def selectCelluleWifiFromDB(self,identificateur):
        """
        Retourne les informations d'une cellule depuis sont identificateur
        @param identificateur identificateur de la cellule
        """
        key ={}
        key["ID"] = identificateur
        ensCelluleWifi = self.__interfacebase.selectTable(self.__interfacebase.celluleIwlisttablename,self.__interfacebase.celluleIwlistmapping,key)
        return ensCelluleWifi

    def insertToDb(self,idList):
        """
        Inserer la cellule en cours dans la BDD
        @param idList identificateuur de cellule
        """
        dico     = self.createConfigListDico(idList)
        self.__interfacebase.insert(self.__interfacebase.celluleIwlisttablename,self.__interfacebase.celluleIwlistmapping,dico)
    
    def updateIntoDb(self,idList):
        """
        Mise a jour de la cellule en cours dans la BDD
        @param idList identificateur de la cellule
        """
        dico     = self.createConfigListDico(idList)
        self.__interfacebase.update(self.__interfacebase.celluleIwlisttablename,self.__interfacebase.celluleIwlistmapping,dico)

    def deleteFromDb(self,idList):
        """
        Suppression de la cellule Wifi
        @param idList identificateur unique de cellule
        """
        key={}
        key['ID']=idList
        return self.__interfacebase.deleteFromTable(self.__interfacebase.celluleIwlisttablename,self.__interfacebase.celluleIwlistmapping,key)
        
    
    def createConfigListDico(self,idList):
        """
        Creation d'un dictionnaire depuis un identificateur de cellule
        @param idList identificateur unique de cellule
        """
        dico ={}
        dico[self.id["key"]]        = idList
        dico[self.essid["key"]]        = self.essid["value"]
        dico[self.mode["key"]]        = self.mode["value"]
        dico[self.extra["key"]]        = self.extra["value"]
        dico[self.encrytionKey["key"]]    = self.encrytionKey["value"]
        dico[self.address["key"]]    = self.address["value"]
        dico[self.bitRate["key"]]    = self.bitRate["value"]
        dico[self.quality["key"]]    = self.quality["value"]
        dico[self.channel["key"]]    = self.channel["value"]
        return dico
